package mysql

import (
	"fmt"
	"github.com/zeromicro/go-zero/core/logx"
	"go-zero-project/services/order/rpc/internal/config"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

// InitMysqlDB 加载Mysql驱动
// go get	gorm.io/driver/mysql  // 安装mysql驱动
// go get	gorm.io/gorm
func InitMysqlDB(mysqlInfo *config.MysqlConfig) (*gorm.DB, error) {
	//mysqlInfo := c.MysqlConfig
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
		mysqlInfo.Name, mysqlInfo.Password, mysqlInfo.Host,
		mysqlInfo.Port, mysqlInfo.DB)
	c := gorm.Config{PrepareStmt: true}
	// 根据配置打开打印sql日志 打印全部
	if mysqlInfo.PrintSqlLog == "ALL" {
		c.Logger = logger.Default.LogMode(logger.Info)
	} else {
		// 根据配置打开打印sql日志 只打印慢SQL
		slowLogger := logger.New(
			//将标准输出作为Writer
			log.New(os.Stdout, "\r\n", log.LstdFlags),
			logger.Config{
				//设定慢查询时间阈值为mysqlInfo.SlowSqlTime
				SlowThreshold: time.Duration(mysqlInfo.SlowSqlTime) * time.Second,
				//设置日志级别，只有Warn和Info级别会输出慢查询日志
				LogLevel: logger.Warn,
			},
		)
		c.Logger = slowLogger
	}
	// 在执行SQL时都会创建一个prepared statement
	db, _ := gorm.Open(mysql.Open(dsn), &c)
	sqlDB, err := db.DB()
	if err != nil {
		logx.Error(fmt.Sprintf("连接数据失败:%s", err.Error()))
		return nil, err
	}
	// 连接存活时间
	sqlDB.SetConnMaxLifetime(time.Second * time.Duration(mysqlInfo.ConnMaxLifetime))
	// 最大连接数
	sqlDB.SetMaxOpenConns(mysqlInfo.MaxOpen)
	// 最大空闲连接数
	sqlDB.SetMaxIdleConns(mysqlInfo.MaxIdleConn)
	// 最大空时间
	sqlDB.SetConnMaxIdleTime(time.Second * time.Duration(mysqlInfo.ConnMaxIdleTime))
	pingErr := sqlDB.Ping()
	if pingErr != nil {
		logx.Error(fmt.Sprintf("连接数据Ping失败:%s", pingErr.Error()))
		return nil, pingErr
	}
	return db, nil
}

//func InitMysqlDB(conf *config.MysqlConfig) (sqlx.SqlConn, error) {
//	dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
//		conf.Name, conf.Password, conf.Host,
//		conf.Port, conf.DB)
//	sqlDB, conErr := sql.Open("mysql", dsn)
//	if conErr != nil {
//		logx.Errorf("connect mysql %s err:%s", dsn, conErr.Error())
//		return nil, conErr
//	}
//	// 连接存活时间
//	sqlDB.SetConnMaxLifetime(time.Second * time.Duration(conf.ConnMaxLifetime))
//	// 最大连接数
//	sqlDB.SetMaxOpenConns(conf.MaxOpen)
//	// 最大空闲连接数
//	sqlDB.SetMaxIdleConns(conf.MaxIdleConn)
//	// 最大空时间
//	sqlDB.SetConnMaxIdleTime(time.Second * time.Duration(conf.ConnMaxIdleTime))
//	pingErr := sqlDB.Ping()
//	if pingErr != nil {
//		logx.Errorf("连接数据Ping失败:%s", pingErr.Error())
//		return nil, pingErr
//	}
//	return sqlx.NewSqlConnFromDB(sqlDB), nil
//}
